home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / a_utils / perl / perl5a1.lha / perl5alpha1 / do / join < prev    next >
Encoding:
Text File  |  1992-08-15  |  912 b   |  46 lines

  1. void
  2. do_join(TARG,arglast)
  3. register STR *TARG;
  4. int *arglast;
  5. {
  6.     register STR **st = stack->ary_array;
  7.     int sp = arglast[1];
  8.     register int items = arglast[2] - sp;
  9.     register char *delim = str_get(st[sp]);
  10.     register STRLEN len;
  11.     int delimlen = st[sp]->str_cur;
  12.  
  13.     st += sp + 1;
  14.  
  15.     len = (items > 0 ? (delimlen * (items - 1) ) : 0);
  16.     if (TARG->str_len < len + items) {    /* current length is way too short */
  17.     while (items-- > 0) {
  18.         if (*st)
  19.         len += (*st)->str_cur;
  20.         st++;
  21.     }
  22.     STR_GROW(TARG, len + 1);        /* so try to pre-extend */
  23.  
  24.     items = arglast[2] - sp;
  25.     st -= items;
  26.     }
  27.  
  28.     if (items-- > 0)
  29.     str_sset(TARG, *st++);
  30.     else
  31.     str_set(TARG,"");
  32.     len = delimlen;
  33.     if (len) {
  34.     for (; items > 0; items--,st++) {
  35.         str_ncat(TARG,delim,len);
  36.         str_scat(TARG,*st);
  37.     }
  38.     }
  39.     else {
  40.     for (; items > 0; items--,st++)
  41.         str_scat(TARG,*st);
  42.     }
  43.     STABSET(TARG);
  44. }
  45.  
  46.